/*
 * \xE6\x9Dユ\xBA\x90锛\x9A\xE6\x9C辫\x80\x81甯\x88\xE7\x89╄\x81\x94缃\x91澶ц\xAE插\xA0\x82-\xE6\x99鸿\x83界\xBD\x91\xE8\x81\x94姹借溅涔\x8BBMS椤圭\x9B\xAE瀹\x9E\xE6\x88\x98
 * 娣\x98瀹\x9D搴\x97:https://item.taobao.com/item.htm?spm=a230r.1.14.70.38d23dfbsQGN1b&id=676341596842&ns=1&abbucket=18#detail
 * Change Logs:
 * Date           Author            Notes
 * 2022-6-5       \xE9\x80\x8D\xE9\x81ュ\x90剧\x9A\x87          the first version
 */
 
 
 
#ifndef __DRV_SOFT_I2C_H__
#define __DRV_SOFT_I2C_H__

#include <stdio.h>

#include "stm32f1xx_hal.h"

#define I2C_DEBUG_LEVEL 2

#if I2C_DEBUG_LEVEL == 0
#define I2C_INFO(fmt, arg...) 
#define I2C_WARNING(fmt, arg...)
#define I2C_ERROR(fmt, arg...)

#elif I2C_DEBUG_LEVEL == 1
#define I2C_INFO(fmt, arg...)   		printf("<<-I2C-INFO->> "fmt"\r\n",##arg)
#define I2C_WARNING(fmt, arg...)
#define I2C_ERROR(fmt, arg...)

#elif I2C_DEBUG_LEVEL == 2
#define I2C_INFO(fmt, arg...)
#define I2C_WARNING(fmt, arg...)		printf("<<-I2C-WARNING->> "fmt"\r\n",##arg)
#define I2C_ERROR(fmt, arg...)

#elif I2C_DEBUG_LEVEL == 3
#define I2C_INFO(fmt, arg...)
#define I2C_WARNING(fmt, arg...)
#define I2C_ERROR(fmt, arg...)	 		printf("<<-I2C-ERROR->> "fmt"\r\n",##arg)
#endif


#define I2C_WR              0x00       		/* \xE5\x86\x99\xE6\xA0\x87蹇\x97 */
#define I2C_RD              (1 << 0)      /* 璇绘\xA0\x87蹇\x97 */
#define I2C_ADDR_10BIT      (1 << 1)      /* 10 浣\x8D\xE5\x9C板\x9D\x80妯″\xBC\x8F */
#define I2C_NO_START        (1 << 2)      /* \xE6\x97\xA0寮\x80濮\x8B\xE6\x9D′欢 */
#define I2C_IGNORE_NACK     (1 << 3)      /* 蹇借\xA7\x86 NACK */
#define I2C_NO_READ_ACK     (1 << 4)      /* 璇荤\x9A\x84\xE6\x97跺\x80\x99涓\x8D\xE5\x8F\x91\xE9\x80\x81 ACK */
#define I2C_NO_STOP         (1 << 5) 		  /* 浼\xA0杈\x93瀹\x8C涓\x8D\xE5\x8F\x91\xE9\x80\x81\xE5\x81\x9C姝\xA2淇″\x8F\xB7 */

// 涓\x8B\xE9\x9D\xA2涓ょ\xA7\x8D\xE6\xA0\x87蹇\x97浣\x8D\xE6\x88\x91\xE8\x87\xAA宸辨坊\xE5\x8A\xA0\xE7\x9A\x84
#define I2C_CONTROL_BYTE    (1 << 6) 		  /* 姣\x8F\xE5\x8F\x91\xE9\x80\x81涓\x80涓\xAA\xE6\x95版\x8D\xAE涔\x8B\xE5\x89\x8D\xE9\x9C\x80瑕\x81\xE5\x8F\x91\xE9\x80\x81涓\x80涓\xAA\xE6\x8Eу\x88跺\xAD\x97\xE8\x8A\x82\xE7\x94ㄦ\x9Dヨ〃绀轰\xB9\x8B\xE5\x90\x8E\xE7\x9A\x84\xE6\x95版\x8D\xAE瀛\x97\xE8\x8A\x82\xE6\x98\xAF\xE5\x91戒护杩\x98\xE6\x98\xAF\xE6\x95版\x8D\xAE(\xE6\x9C\x89\xE7\x9A\x84\xE5\x9C烘\x99\xAF浼\x9A\xE7\x94ㄥ\x88版\xAF\x94濡\x82锛\x9Assd1306椹卞\x8Aㄥ\xB1\x8F) */
#define I2C_SAME_BYTE       (1 << 7) 		  /* 杩\x9E缁\xAD\xE5\x8F\x91\xE9\x80\x81msg.tLen涓\xAAmsg.sByte\xE6\x95版\x8D\xAE瀛\x97\xE8\x8A\x82,\xE5\x8F\x91\xE9\x80\x81\xE7\x9B稿\x90\x8C瀛\x97\xE8\x8A\x82浼\x9A\xE7\x94ㄥ\x88伴\x81垮\x85\x8D寰\xAA\xE7\x8E\xAF璋\x83\xE7\x94ㄤ\xBC\xA0杈\x93\xE5\x87芥\x95\xB0 */

/* i2c娑\x88\xE6\x81\xAF瀹\x9A涔\x89 */
struct I2C_MessageTypeDef
{
	uint8_t   *buf;    		// 浼\xA0杈\x93\xE6\x8C\x87瀹\x9A缂\x93\xE5\x86插\x8C虹\x9A\x84\xE6\x95版\x8D\xAE
	uint16_t  addr;    		// 浠\x8E璁惧\xA4\x87\xE5\x9C板\x9D\x80
	uint16_t  tLen;		 	  // \xE9\x9C\x80瑕\x81浼\xA0杈\x93\xE7\x9A\x84\xE6\x95版\x8D\xAE\xE9\x95垮害(\xE6\x9C\x80澶\xA765535),\xE5\x8A\xA0浜\x86I2C_CONTROL_BYTE\xE6\xA0\x87蹇\x97涓\x8D绠\x97涓\x8A璇ラ\x95垮害
	uint16_t  rLen; 	 	  // 杩\x94\xE5\x9B\x9E\xE6\x88\x90\xE5\x8A\x9F浼\xA0杈\x93\xE7\x9A\x84\xE6\x95版\x8D\xAE\xE9\x95垮害,濡\x82\xE6\x9E\x9C\xE5\x8A\xA0浜\x86I2C_CONTROL_BYTE\xE6\xA0\x87蹇\x97骞朵\xB8\x8D浼\x9A绠\x97涓\x8A\xE6\x8Eу\x88跺\xAD\x97\xE8\x8A\x82\xE9\x95垮害
	uint8_t   flags;	 	  // \xE6\xA0\x87蹇\x97浣\x8D
	uint8_t   cByte;	 	  // I2C_CONTROL_BYTE
	uint8_t   sByte;	 	  // I2C_SAME_BYTE
};


/* i2c\xE6\x80荤嚎 */
struct I2C_BusTypeDef
{
	GPIO_TypeDef *gpiox;
	uint32_t gpio_rcc;
	uint16_t sda_gpio_pin;
	uint16_t scl_gpio_pin;
	
	uint32_t retries; // \xE5\x8F\x91\xE5\x9C板\x9D\x80\xE6\x97\xA0\xE5\x93\x8D搴\x94\xE9\x87\x8D璇\x95娆℃\x95\xB0(\xE6\x9C\x80澶т\xB8\x8D\xE8\x83借\xB6\x85杩\x87255)
	
	void (*udelay)(uint32_t us);
	void (*lockInit)(void);
	void (*lock)(void);
	void (*unlock)(void);
};

extern struct I2C_BusTypeDef i2c1;

int I2C_BusInitialize(void);
uint32_t I2C_TransferMessages(struct I2C_BusTypeDef *bus, struct I2C_MessageTypeDef msgs[], uint32_t num);

#endif
